let fs = require("fs");
let nunjucks = require("nunjucks");
let ArrayHelp = require("./untis/ArrayHelp");
let dbCofig = require('./config/db');
let mysql = require("mysql");
let staticFileType = ['.ico', '.gif', '.png', '.jpg', '.css', '.js'];
let ThinkNode = {

    buildController: function () {
        let connection = mysql.createConnection({ host: dbCofig.host, user: dbCofig.user, password: dbCofig.password, database: dbCofig.database, port: dbCofig.port })
        connection.createConnection();
        //查询所以的表
        let tables = 'show tables'
        connection.query(tables, function (err, result) {
            if (err) {
                console.log(err);
            } else {


            }

        })


    },
    staticFileHandle: function (path, res) {
        fs.readFile(path, function (err, data) {
            if (err) {
                console.log(err);
            } else {
                res.end(data);
            }

        })

    },
    findControllAndHandle: async function (req, res, funcend,session) {
        let url = req.url;
        let isStatic = false;
        //静态资源
        staticFileType.forEach(element => {
            if (url.lastIndexOf(element) > -1) {
                isStatic = true;
                
                let path = '.' +decodeURI(url);
                ThinkNode.staticFileHandle(path, res);
            }

        });
        if (isStatic == false) {
            res.setHeader("Content-Type", "text/html; charset=utf-8");
            let controllerAndAction = ArrayHelp.buildKeyAndVal(url.split("?")[1], '&', "=");
            let front = controllerAndAction["f"] ? controllerAndAction["f"] : 'home';
            let controller = controllerAndAction["c"] ? controllerAndAction["c"] : 'Index';
            let action = controllerAndAction["a"] ? controllerAndAction["a"] : 'index';
            let controllerPath = './' + front + '/controller/' + controller.replace(controller[0], controller[0].toUpperCase()) + "Controller.js";
            fs.stat(controllerPath, async function (err, stats) {
                if (err) {
                    console.log('控制器找不到，请确认url中c 对应的值得控制器是否存在!');
                } else {
                    let classFile = require(controllerPath);
                    try {
                        let obj = new classFile(req, res, nunjucks);
                        if (obj.__proto__.hasOwnProperty(action)) {//判断该类中是否存在该方法
                            let content = await obj[action]();
                            //console.log('业务逻辑执行的结果'+content);
                            //前置中间件
                            //var i = 0;
                            //ThinkNode.next(funcsend, i, req, res, content);
                            if(typeof(content)==='object'){
                                content = JSON.stringify(content);
                            }
                            res.write(content);
                            //写入session
                            if(res.session){
                                console.log(res.session,req.session);
                                let newSession=extend(req.session,res.session);
                                delete(session[req.cookie.node_session]);
                                session[req.cookie.node_session]=newSession;
                            }
                            res.end();
                            return content;
                        } else {
                            //console.log('no method');
                            res.end('<h1 styple="color:red">八戒你又调皮了,这个类中不存在' + action + '方法</h1>');
                        }

                    } catch (err) {
                        console.log(err);
                        //报错结束请求响应
                        res.end();
                    }

                }
            })

        }

    },

    next: function (funcs, i, req, res, content) {
        if (isNaN(i)) return;
        var task = funcs[i++];  // 取出函数数组里的下一个函数
        if (!task) {    // 如果函数不存在,return
            return;
        }
        if (content) {
            task(req, res, content, ThinkNode.next(funcs, i, req, res));   // 否则,执行下一个函数
        } else {
            task(req, res, ThinkNode.next(funcs, i, req, res));   // 否则,执行下一个函数
        }
    },

    parseDataAndHanle: function (req, res, funcsend,session) {
        let postData = '';
        req.on('data', function (chunk) {//流方式读取数据，数据一段一段传输，这一段代码是异步的
            postData += chunk;
        });

        req.on('end', async function () {
            //解析提交数据
            let data = ArrayHelp.buildKeyAndVal(postData, '&', "=");
            //把get和post数据都写入到query
            req.query = data;
            //如果是get方式把数据写入到 get 属性中
            if (req.method == 'GET') {
                req.get = data;
            }
            //如果是post方式把数据写入到 post 属性中
            if (req.method == 'POST') {
                req.post = data;
            }
            //解析cookie
            req.cookie = ArrayHelp.buildKeyAndVal(req.headers.cookie, '; ', '=');
            res.session={};
            req.session={};
            node_session=null;
            //如果没有 node_session 则设置一个
            if (!req.cookie.node_session) {
                node_session = new Date().getTime() + '_' + Math.random();
                res.setHeader('Set-Cookie', "node_session=" + node_session);
                req.cookie.node_session=node_session;
                // fs.exists('./session'),function(result){
                //     if(!result){
                //         fs.mkdir('./session',function(err){
                //             fs.writeFile('./session/'+node_session+'.txt',function(){
                //                 ThinkNode.findControllAndHandle(req, res, funcsend);
                //             })
                //         })                     
                //     }else{
                //         ThinkNode.findControllAndHandle(req, res, funcsend);
                //     }
                // }
                              
            } else {
                node_session=req.cookie.node_session;
                if(session[node_session]){
                    req.session=session[node_session];
                }              
                // //session以文件存储
                // let sessionId = req.cookie.node_session;
                // //获取session的数据
                // fs.readFile("./session/" + sessionId + ".txt", function (err, data) {
                //     //执行控制器,与后置控制器
                //     let session = data;
                //     req.session = session;
                //     ThinkNode.findControllAndHandle(req, res, funcsend);
                // })
            }
            ThinkNode.findControllAndHandle(req, res, funcsend,session);
        })
    },
    server: function () {

        var funcs = []; // 待执行的函数数组----前置控制器
        var funcsend = []; // 待执行的函数数组----后置控制器
        let session=[];
        var app = function (req, res) {
            var i = 0;
            //前置中间件
            ThinkNode.next(funcs, i, req, res);
            //中间件end
            //执行解析数据与控制器与后置控制器
            ThinkNode.parseDataAndHanle(req, res, funcsend,session);
            //console.log(session);
        }

        /**
         * use方法就是把函数添加到函数数组中---前置控制器
         * @param task
         */
        app.use = function (task) {
            funcs.push(task);
        }

        /**
       * use方法就是把函数添加到函数数组中---后置控制器
       * @param task
       */
        app.useend = function (task) {
            funcsend.push(task);
        }

        return app;    // 返回实例
    }


}
function extend(target, source) {
    for (var obj in source) {
        target[obj] = source[obj];
    }
    return target;
}


module.exports = ThinkNode;

